package com.jerry.netty.buffer;

import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * MappedByteBuffer可以让文件直接在内存(堆外的内存)中进行修改， 而如何同步到文件由NIO来完成.
 */
public class MappedByteBufferTest {
    public static void main(String[] args) throws Exception{
        RandomAccessFile randomAccessFile = new RandomAccessFile("file_source.txt","rw");
        //获取对应通道
        FileChannel fileChannel = randomAccessFile.getChannel();

        /**
         * MappedByteBuffer， 可以让文件直接在内存(堆外的内存)中进行修改
         * 参数1：FileChannel.MapMode.READ_WRITE   代表使用读写模式
         * 参数2：0 代表直接修改起始位置
         * 参数3：5 代表映射到内存的大小。注意：不是索引位置。file_source.txt有多少字节映射到内存
         */
        MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE,0,5);
        mappedByteBuffer.put(0,(byte)'H');
        mappedByteBuffer.put(3,(byte)'9');
//        mappedByteBuffer.put(5,(byte)'1');     //IndexOutOfBoundsException

        //关闭文件
        randomAccessFile.close();
        System.out.println("修改成功");
    }
}
